package rsj.interceptor;

import com.rlyy.aibase.utils.base.Box;
import com.rlyy.aibase.utils.base.MapNode;
import common.exec.RsjIllegalArgueException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import rsj.entity.Menu;
import rsj.service.CacheMenuService;

import java.util.List;
import java.util.Set;

/**
 * 角色权限校验
 *
 * @author yuanqinglong
 * @since 2021/5/28 11:00
 */
@Component
public class AuthInterceptor extends MyDecorator {

    @Autowired
    private CacheMenuService cacheMenuService;

    /**
     * 在检验权限之前先判断是否是 白名单接口
     *
     * @param whiteApiInterceptor 白名单API校验器
     */
    protected AuthInterceptor(MyInterceptor whiteApiInterceptor) {
        super(whiteApiInterceptor);
    }


    @Override
    public boolean preHandle(Box in) throws Exception {
        // 调用白名单校验-如果不是白名单API 需要校验角色权限
        boolean whiteApi = super.preHandle(in);
        // 不在白名单的api 校验权限
        if (!whiteApi) {
            MapNode mapNode = in.getMapNode("$user");
            String userId = mapNode.getValue("User_Id");
            List<Menu> menuList = cacheMenuService.getMenuByUserId(userId);
            // 判断此用户的角色下菜单中是否包含此api、不包含此api权限不足
            boolean havePermission = menuList.stream().anyMatch(menu -> {
                // 获取此菜单下的API集合 看请求的API是否才此集合中
                Set<String> apis = MenuAuthMapping.getMenuById(menu.getMenuId());
                return apis.contains("/api/" + in.getApi().replace("_", "/"));
            });
            // 用户菜单中的API不包含 请求的API 返回权限不足
            if (!havePermission) {
                throw new RsjIllegalArgueException("权限不足");
            }
        }
        return true;
    }


}
